const {List, Map, Seq, fromJS} = require('immutable')

let list1 = List([1, 2])
let list2 = list1.push(3, 4, 5)

// 涉及到修改的　都会创建一个新的 对象
// console.dir(list1)
// console.dir(list2)

let alpha = Map({a: 1, b: 2})
let r = alpha.map((v, k) => {
  return k.toUpperCase()
});
// console.dir(r);

// 在任何需要　collection 类型的地方, 都可以传原生的 数组或者 对象
let map1 = Map({a: 1})
let map2 = Map({b: 2})
const obj = {d: 100, o: 200}
// 后端面的会覆盖前面传递的值，也符合直觉
let map3 = map1.merge(map2, obj)

const myObject = {a: 1, b: 2}
let o = Seq(myObject).map(x => x * x).toObject()
console.dir(o)

// 这里 key 自动变成了 字符串 ...
const obj1 = {1: "one"}
console.dir(Object.keys(obj1))

let map = fromJS(obj1)
console.dir(map.get('1'))

const nestsed = fromJS({a: {b: {c: [1,2,3,4], d: 1}}})
console.dir(nestsed.toLocaleString())

const nested2 = nestsed.mergeDeep({ a: { b: { d: 6, c: [9] } } })
console.dir(nested2.toLocaleString())

console.log(nested2.getIn([ 'a', 'b', 'd' ]))

const nested3 = nested2.updateIn([ 'a', 'b', 'd' ], value => value + 1)
console.log(nested3);

const obj11 = {a: 1, b: 2, c: 3}
const obj22 = {a: 1, b: 2, c: 3}
console.dir (obj11 === obj22)
let map11 = Map(obj11)
let map22 = Map(obj22)
console.dir (map11 === map22)
console.dir (map11.equals(map22))

const oddSquares = Seq([ 1, 2, 3, 4, 5, 6, 7, 8 ])
  .filter(x => x % 2 !== 0)
  .map(x => x * x)

console.dir(oddSquares.toString())
